package com.my.learn.thread.juc;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 用来控制多个线程互相等待，只有当多个线程都到达时，这些线程才会继续执行。
 * 和 CountdownLatch 相似，都是通过维护计数器来实现的。线程执行 await() 方法之后计数器会减 1，
 * 并进行等待，直到计数器为 0，所有调用 await() 方法而在等待的线程才能继续执行。
 */
public class CyclicBarrierTest {

    public static void main(String[] args) throws BrokenBarrierException, InterruptedException {
        int threadNum = 10;
        CyclicBarrier cyclicBarrier = new  CyclicBarrier(threadNum);
        for (int i = 0; i < 9; i++) {
           ExecutorService executorService = Executors.newFixedThreadPool(10);
           executorService.submit(()->{
               try {
                   cyclicBarrier.await();
               } catch (InterruptedException e) {
                   e.printStackTrace();
               } catch (BrokenBarrierException e) {
                   e.printStackTrace();
               }
               System.out.println("test");
           });
        }
        cyclicBarrier.await();
        System.out.println("end");
        cyclicBarrier.reset();
        cyclicBarrier.await();
        System.out.println("end1");
    }
}
